package at.fhj.itm;
// TODO Add JavaDoc Documentation Comments
/**
 * Programm sorts numbers in order and stores it in array as queue. 
 * Ne entries are glued to the end old entries at the front are deleted because there is not enough 
 * space
 * 
 * @author fischerm
 *
 */

public class Queue {
	
  private int maxSize;

  private long[] queArray;

  private int front;

  private int rear;

  private int nItems;

  /**
   * Sets MaxSize to Queue. 
   * It's a waiting queue.  Every element is stored at the end, and orders it and the first position after
   * every element was edited.
   * @param s
   */
  
  public Queue(int s) {
    maxSize = s;  // Maximum size definition of array 
    queArray = new long[maxSize];  //Sets size for the array
    front = 0;
    rear = -1;
    nItems = 0;
  }

  /**
   * Puts item at end of a queue. 
   * The queArray orders the element at pos. 1 
   * 
   * @param j
   */
   public void insert(long j) {
    if (rear == maxSize - 1) // deal with wraparound
      rear = -1;
    queArray[++rear] = j; // increment rear and insert
    nItems++; 
  }

   /**
    * Removes the item from front queue .
    * long temp var.  gets the value and increses the front
    * @return
    */
  //   take item from front of queue
  public long remove() {
    long temp = queArray[front++]; // get value and incr front
    if (front == maxSize) // deal with wraparound
      front = 0;
    nItems--; // one less item
    return temp;
  }
/**
 * Shows the top element in front
 * @return
 */
  public long peekFront() {
    return queArray[front];
  }
/**
 * Method Looks if nItems == 0 and returns it
 * 
 * @return
 */
  public boolean isEmpty() {
    return (nItems == 0);
  }
/**
 * Shows  if list is full
 * @return
 */
  public boolean isFull() {
    return (nItems == maxSize);
  }
 /**
  * Method returns nItems
  * 
  * @return
  */
  public int size() {
    return nItems;
  }

 /**
  * Main Method inserts Queue Elements
  * and removes it. 
  * @param args
  */
  // TODO Refactor / Delete Main Method and create JUnit test code
  public static void main(String[] args) {
    Queue theQueue = new Queue(5); // queue holds 5 items

    theQueue.insert(10);
    theQueue.insert(20);
    theQueue.insert(30);
    theQueue.insert(40);

    theQueue.remove(); 
    theQueue.remove(); 
    theQueue.remove();

    theQueue.insert(50); 
    theQueue.insert(60); //    (wraps around)
    theQueue.insert(70);
    theQueue.insert(80);
/*
 *while queue is not empty remove elements in front  
 */
    while (!theQueue.isEmpty()) {
      long n = theQueue.remove(); // (shows numbers 40, 50, 60, 70, 80)
      System.out.print(n);
      System.out.print(" ");
    }
    System.out.println("");
  }
}
           
         